package cn.kgc.util;

import cn.kgc.dao.BaseDao;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 *单例模式，保证BdataBaseUtil_single 唯一。
 * 两种 ： 饿汉模式： 肚子饿了，上来就创建一个对象 （类加载，时效强）
 *        饱汉(懒汉)模式： 需要有的时候在创建一个对象 （延时加载，节省内存资源） 问题：线程不安全问题。怎么解决？ 加线程锁，实现同步
 */
public class DataBaseUtil_single {

    /**
     *  2.写一个引用静态对象是指向空的（懒汉模式）
     */

    private static DataBaseUtil_single dataBaseUtil_single=null;
    static Properties properties=new Properties();
    /**
     * 1.构造方法私有化
     *   作用：将来外部不能创建对象，只能类内部创建对象
     *
     */
    private  DataBaseUtil_single() {

        /**
         * 4.写实例对象的功能
         */
        //获取database.properties 里面的信息封装到Properties对象中，操作对象获取属性
        InputStream inputStream = BaseDao.class.getClassLoader().getResourceAsStream("database.properties");
        try {
            properties.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 3.写一个静态的方法，给系统返回实力对象  synchronzied 解决线程安全问题
     *   延迟加载
     * @return
     */
    public synchronized static DataBaseUtil_single getInstance(){
        if(dataBaseUtil_single!=null){

            return dataBaseUtil_single;
        }

        dataBaseUtil_single=new DataBaseUtil_single();
        return dataBaseUtil_single;
    }


    /**
     * 获取链接的方法
     * @return
     */
    public  Connection getConnect(){
        //下面jdbc的操作获取数据
        try {
            Class.forName(properties.getProperty("driver"));
            //2.创建链接
            return DriverManager.getConnection(properties.getProperty("url")
                                              ,properties.getProperty("username"),
                                                properties.getProperty("password"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }
}
